package com.xyx.hw;

import java.util.Scanner;

public class HomeWork0723 {
	
	/**
	 * 
	 * 使用非递归算法算斐波那契数列的第二种算法
	 * @param n
	 * @return
	 */
	private static long caculateFF(int n) {
		// 返回值变量
		long lReault;
		// 前一项的值（第一项的值）
		long param1 = 1;
		// 后一项的值（第二项的值）
		long param2 = 1;
		// 第一项和第二项直接取值1
		if (n == 1 || n == 2) {
			lReault = 1;
		} else {
			for (int i = 1; i <= n - 2; i++) {
				// 从第三项开始，是前两项之和
				// long temp = param2; // 保留旧的param2的值
				param2 = param1 + param2; // 计算后一项是前两项之和
				param1 = param2 - param1; // 把旧的param2的值赋值给param1
				// param1 = temp;// 把旧的param2的值赋值给param1
			}
			// param2的值就是第N项的值
			lReault = param2;
		}
		return lReault;
	}
	 /**
	  * 使用非递归的方式计算斐波那契数列
	 * @param fbNum
	 */
	private static long  fibonacciNum(int fbNum) {
		//定义项数大于2的话，定义数组下标为3
		 int num=2;
		 //初值为0的值
		 long res = 0;
		 do{
			 
			 //每次传回来数组长度加一
			   num++;
			   
			   //当传参数下标为1或者2时赋值为1
			 if(fbNum==1||fbNum==2) {
				 return 1;
				 //当传参数大于2时
			 }else{
				 //定义斐波那契long型数组
				 long[] str=new long[num];
				 //循环赋值
				 for(int i3=0;i3<str.length;i3++) {
					 //项数为0时赋值为1
					 if(i3==0) {
						 str[0]=1;
						//项数为1时赋值为1
					 }else if(i3==1){
						 str[1]=1;
						 //项数小于传参数时
					 } else if(i3<num){
						 str[0]=1;
						 str[1]=1;
						 //每次都为第三个数赋初值
					 str[i3]=str[i3-2]+str[i3-1];
					 res=str[i3];
					 }
				 }
			 }	
			 //大于穿参数值时跳出斐波那契数列数组赋值的while语句
		 }while(num<fbNum);
		 //将结果传回
		 
		return res;
	 }
public static void main(String[] args) {
	Scanner sc=new Scanner(System.in);
	System.out.println("输入指定项数：");
	int fiboNum=sc.nextInt();
	//传入指定斐波那契 项数
	long res=fibonacciNum(fiboNum);
	System.out.println("此项斐波那契为：");
	//将结果输出
	System.out.println(res);
	//第二种方法
	System.out.println(caculateFF(fiboNum));
	}
}
